#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//文件在计算机里面存的都是二进制

//程序对文件操作,其实是对系统开辟了一个跟文件向连接的缓冲区buf操作
//在linux系统万物皆文件,包括socket通讯都是文件,
    //对它们操作其实不是直接跟文件操作而是操作系统为我们开辟对应的缓冲区
    //读缓冲区input 写缓冲区output
    //关闭文件，不仅仅是释放内存,还是将缓冲区的数据一次性放入到文件中,最后释放资源

//流 可以将一个字节形象的比喻成一滴水 流是对输入输出源的一种抽象
//也是对传输信息的抽象
//c语言中.I/O操作可以简单地看作从程序移进或移出字节，这种搬运过程叫流(stream)

//数据组织形式
//文本文件: ASCII,每个字节存放一个字符的ASCII码
//二进制流: 数据按其在内存中原样存储

void test01()
{
    FILE *file = fopen("./test.txt", "r");
    if(NULL == file)
    {
        printf("打开文件失败\n");
        return ;
    }

    //比如文件内容是abcdef但其实后面有一个"EOF" 
    //真实的内容是abcdefEOF
    char ch;
    while (!feof(file)) //文件没有读到末尾
    {
        ch = fgetc(file);

        if(feof(file)) //文件有一个文件结尾标志EOF是不能读出来的
        {
            break;
        }

        printf("%c", ch);
    }
    printf("\n");

    //关闭文件
    fclose(file);
    file = NULL;
}

//另一种方法
void test02()
{
    FILE *file = fopen("./test.txt", "r");
    if(NULL == file)
    {
        printf("打开文件失败\n");
        return ;
    }

    char ch;
    while ((ch = fgetc(file)) != EOF)
    {
        printf("%c", ch);
    }
    printf("\n");

    //关闭文件
    fclose(file);
    file = NULL;
}

struct Person
{
    //char name[64]; 
    char *name; 
    //注意如果是指针要自己组织一个格式写入文件,不能把指针内容写进入，因为内存已经丢失
    int age;
};

void test03()
{
    struct Person p1 = {"aaa", 20};
}

int main(int argc, char const *argv[])
{
    test01();
   printf("%c\n", EOF);
   test02();
    return 0;
}

//对于c语言来说默认的编码字符集是根据操作系统 
//内存的大小 以及这块内存能表达什么样的内容 是编译器决定的 
//以文本的形式存 就是将这块内存的大小按照默认的编码 转换一下存到磁盘中
//以音视频为例子 可以按照某个规则来存 到磁盘中 至于用多大的内存 是用户自己来决定
